from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver.edge.service import Service as EdgeService
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.firefox import GeckoDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from longguo_ui.config.config import config


class Driver:
    """浏览器驱动管理类

    负责初始化、配置和关闭不同类型的浏览器驱动，
    支持Chrome、Firefox和Edge浏览器，通过配置文件动态选择浏览器类型。
    实现了单例模式思想，确保每个实例只初始化一次浏览器驱动。
    """

    def __init__(self):
        """初始化Driver实例

        初始化时不直接创建浏览器驱动，而是在调用get_driver()方法时延迟初始化，
        减少不必要的资源消耗。
        """
        self.driver = None  # 浏览器驱动实例，初始为None

    def get_driver(self):
        """获取并返回浏览器驱动实例

        若驱动未初始化，则根据配置文件中的浏览器类型创建对应的驱动实例，
        并应用预设的浏览器配置（如窗口最大化、禁用信息栏等）。
        支持Chrome、Firefox和Edge三种浏览器，若配置了不支持的浏览器类型则抛出异常。

        Returns:
            WebDriver: 初始化完成的浏览器驱动实例
        """
        if self.driver is None:  # 确保驱动只被初始化一次
            # 根据配置选择Chrome浏览器
            if config.BROWSER.lower() == 'chrome':
                options = webdriver.ChromeOptions()
                # 添加浏览器启动选项
                options.add_argument("--start-maximized")  # 窗口最大化
                options.add_argument("--disable-infobars")  # 禁用信息栏
                # 无头模式（无界面运行），如需可视化操作可注释此行
                # options.add_argument("--headless=new")

                # 初始化Chrome驱动，自动管理驱动版本
                self.driver = webdriver.Chrome(
                    service=ChromeService(ChromeDriverManager().install()),
                    options=options
                )

            # 根据配置选择Firefox浏览器
            elif config.BROWSER.lower() == 'firefox':
                options = webdriver.FirefoxOptions()
                options.add_argument("--start-maximized")  # 窗口最大化

                # 初始化Firefox驱动，自动管理驱动版本
                self.driver = webdriver.Firefox(
                    service=FirefoxService(GeckoDriverManager().install()),
                    options=options
                )

            # 根据配置选择Edge浏览器
            elif config.BROWSER.lower() == 'edge':
                options = webdriver.EdgeOptions()
                options.add_argument("--start-maximized")  # 窗口最大化

                # 初始化Edge驱动，自动管理驱动版本
                self.driver = webdriver.Edge(
                    service=EdgeService(EdgeChromiumDriverManager().install()),
                    options=options
                )

            # 处理不支持的浏览器类型
            else:
                raise ValueError(f"不支持的浏览器类型: {config.BROWSER}")

            # 设置隐式等待时间（全局元素查找超时）
            self.driver.implicitly_wait(config.IMPLICITLY_WAIT)
            # 打开测试目标URL
            self.driver.get(config.TEST_URL)

        return self.driver

    def quit_driver(self):
        """安全退出浏览器驱动

        若驱动实例存在，则关闭所有关联窗口并终止驱动进程，
        最后将驱动实例置为None，释放资源。
        """
        if self.driver:
            self.driver.quit()  # 关闭浏览器及驱动进程
            self.driver = None  # 重置驱动实例为None